package com.briup.day09;

/**
 * 比赛场馆类
 */
class PlayingVenue {
    /**
     * 比赛场馆类的核心功能，比赛展示：
     * 要求：所有的运动都能够通过这个方法展示
     */
    /*
     多态的前提：
        1、存在继承关系
        2、子类重写了从父类中继承的方法
        3、需要使用父类的引用指向子类的对象
     多态的优点：
        1、增强程序的可扩展性，因为父类的引用可以接收
        所有其子类的对象，所以无论后续添加了多少类，主要是它的
        子类类型，那么都能接收
        2、因为主要是同一个父类的对象，都能直接使用父类引用接收，
        所以对于同质的方法，可以只定义一个，实体父类的引用进行接收即可；
        因此，多态在一定程度上可以降低方法定义代码的冗余度
     多态的弊端：因为是使用父类的引用指向子类的对象，所以在编码期间，
     是无法使用父类的引用变量调用子类独有的方法；如果非要使用子类独有的方法，
     那么只能将父类的引用强制转换为子类的引用
     */
    public static void show(Sport s) {
        s.play();
        // 引用数据类型进行强制类型转换时，需要注意只能将父类的类型引用转换为其实际的子类对象的引用
        // 如BasketBall对象只能转为实际的BasketBall引用，无法将FootBall转为BasketBall，
        // 否则会出现ClassCastException 类型转换异常
        // 如果要避免该异常，可以在转换前使用 instanceOf关键字进行判断，判断，某一个引用指向的对象是否属于某一个类型
        if (s instanceof BasketBall) {
            System.out.println("s属于篮球类对象");
            ((BasketBall) s).show();
        }

    }
    /*public static void show(BasketBall basketBall) {
        basketBall.play();
    }

    public static void show(FootBall footBall) {
        footBall.play();
    }*/
}

class Sport {
    public void play() {
        System.out.println("运动");
    }
}

// 篮球类
class BasketBall extends Sport {
    public void play() {
        System.out.println("打篮球");
    }

    public void show() {
        System.out.println("展示一下球技");
    }
}

// 足球类
class FootBall extends Sport {
    public void play() {
        System.out.println("踢足球");
    }
}

// 游泳类
class Swimming extends Sport {
    @Override
    public void play() {
        System.out.println("在游泳馆中游泳");
    }
}

class BaseBall extends Sport {
    @Override
    public void play() {
        System.out.println("打棒球");
    }
}

class VenueTest {
    public static void main(String[] args) {
        PlayingVenue.show(new BasketBall());
        PlayingVenue.show(new FootBall());
        PlayingVenue.show(new Swimming());
        PlayingVenue.show(new BaseBall());
    }
}